#!/bin/bash
#
# 金牛座API文档和类型生成工具 - 统一命令行工具
# 
# 此脚本集成了所有文档与类型生成功能
# 
# 版本: 1.0.0
# 作者: Urban Lifeline 团队
# 日期: 2024-04-01
#

# 当前脚本所在目录（用于定位其他脚本）
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BASE_DIR="$(dirname "$SCRIPT_DIR")"

# 加载环境配置文件
CONFIG_FILE="$SCRIPT_DIR/env.config"
if [ ! -f "$CONFIG_FILE" ]; then
  echo "错误: 找不到配置文件 $CONFIG_FILE"
  exit 1
fi

# 加载配置文件
source "$CONFIG_FILE"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # 无颜色

# 默认参数
OFFLINE_MODE=false
REFRESH_TOKEN=false
SKIP_CONFIG=false
EXPORT_CSV=false
COMMAND="all"
TARGET_TABLE=""
SCHEMA_NAME="$SCHEMA_NAME"
ENABLE_API_LOGGING=false
CLEAR_API_LOGS=false
CONFIG_ACTION=""
CONFIG_VALUE=""

# 显示LOGO
function show_logo {
    echo -e "${CYAN}"
    echo "    _  __                             ____         _           "
    echo "   (_)/ _|       _   _ _ __| |__   __ _| __ )    __| | ___   ___ "
    echo "   | | |_ _____ | | | | '__| '_ \ / _\` |  _ \   / _\` |/ _ \ / __|"
    echo "   | |  _|_____|| |_| | |  | |_) | (_| | |_) | | (_| | (_) | (__ "
    echo "   |_|_|        \__,_|_|  |_.__/ \__,_|____/   \__,_|\___/ \___|"
    echo "                                                               "
    echo -e "${NC}"
    echo -e "${BLUE}金牛座API文档和类型生成工具 - 统一命令行工具${NC} v1.0.0"
    echo ""
}

# 显示当前环境配置
function show_config {
    echo -e "${BLUE}当前环境配置:${NC}"
    echo -e "API地址: ${YELLOW}$AUTO_API_BASE_URL${NC}"
    echo -e "项目ID: ${YELLOW}$PROJECT_ID${NC}"
    echo -e "默认Schema: ${YELLOW}$SCHEMA_NAME${NC}"
    echo -e "文档和类型输出目录: ${YELLOW}$OUTPUT_BASE_DIR${NC}"
    echo -e "配置文件: ${YELLOW}$CONFIG_FILE${NC}"
    echo -e "API日志记录: ${YELLOW}$([ "$ENABLE_API_LOGGING" = true ] && echo "启用" || echo "禁用")${NC}"
    echo ""
}

# 打印帮助信息
function print_help {
    show_logo
    echo "用法: $0 [命令] [选项] [参数]"
    echo ""
    echo -e "${GREEN}命令:${NC}"
    echo "  all                   执行完整的文档和类型生成流程（默认）"
    echo "  config                管理表配置"
    echo "  docs                  只生成文档和类型定义"
    echo "  enable-all            启用所有表的文档和类型生成"
    echo "  export                导出表数据为CSV"
    echo "  test                  测试API连接和环境配置"
    echo "  help                  显示帮助信息"
    echo ""
    echo -e "${GREEN}选项:${NC}"
    echo "  -o, --offline         离线模式，不连接API"
    echo "  -r, --refresh-token   强制刷新token"
    echo "  -s, --skip-config     跳过配置生成步骤"
    echo "  -e, --export-csv      导出CSV数据"
    echo "  -t, --table <表名>     指定操作的表名"
    echo "  -h, --help            显示帮助信息"
    echo "  --schema <名称>       指定数据库schema名称"
    echo "  --log-api             启用API请求和响应日志记录"
    echo "  --clear-api-logs      清除API日志文件"
    echo ""
    echo -e "${GREEN}config 子命令:${NC}"
    echo "  $0 config enable <表名>     启用指定表"
    echo "  $0 config disable <表名>    禁用指定表"
    echo "  $0 config list              列出所有表配置状态"
    echo "  $0 config edit <表名> <JSON> 自定义指定表配置"
    echo ""
    echo -e "${GREEN}示例:${NC}"
    echo "  $0                           # 执行完整流程"
    echo "  $0 all -o                    # 离线模式执行完整流程"
    echo "  $0 all --log-api             # 执行完整流程并记录API日志"
    echo "  $0 docs -r --schema 项目ID  # 指定schema生成文档并强制刷新token"
    echo "  $0 enable-all                # 启用所有表"
    echo "  $0 test                      # 测试API连接"
    echo "  $0 config list               # 查看所有表配置状态"
    echo "  $0 config enable demo_table   # 启用demo_table表"
    echo ""
    
    # 显示当前环境配置
    show_config
}

# 执行完整流程
function execute_all {
    echo -e "${BLUE}=== 开始执行完整流程 ===${NC}"
    
    # 构建参数
    args=""
    
    if [ "$OFFLINE_MODE" = true ]; then
        args="$args --offline"
    fi
    
    if [ "$REFRESH_TOKEN" = true ]; then
        args="$args --refresh-token"
    fi
    
    if [ "$SKIP_CONFIG" = true ]; then
        args="$args --skip-config"
    fi
    
    if [ "$EXPORT_CSV" = true ]; then
        args="$args --export-csv"
    fi
    
    if [ -n "$TARGET_TABLE" ]; then
        args="$args --table $TARGET_TABLE"
    fi
    
    if [ -n "$SCHEMA_NAME" ]; then
        args="$args --schema $SCHEMA_NAME"
    fi
    
    if [ "$ENABLE_API_LOGGING" = true ]; then
        args="$args --log-api"
    fi
    
    # 通过 Node.js 脚本执行全部流程
    cd "$SCRIPT_DIR"
    echo -e "${YELLOW}执行命令: node generateTableDocs.js $args${NC}"
    node generateTableDocs.js $args
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}完整流程执行成功！${NC}"
        
        # 显示输出位置
        echo -e "文档输出位置: ${YELLOW}$BASE_DIR/tables/${NC}"
        echo -e "类型定义输出位置: ${YELLOW}$BASE_DIR/types/${NC}"
        
        # 显示汇总文件链接
        echo -e "表汇总文档: ${YELLOW}$BASE_DIR/tables/tables_summary.md${NC}"
        echo -e "类型汇总文件: ${YELLOW}$BASE_DIR/types/tablelist.ts${NC}"
    else
        echo -e "${RED}执行失败，请查看日志获取详细信息${NC}"
        exit 1
    fi
}

# 只生成文档
function execute_docs {
    echo -e "${BLUE}=== 开始生成文档和类型定义 ===${NC}"
    
    # 跳过表配置生成，直接生成文档
    SKIP_CONFIG=true
    execute_all
}

# 启用所有表
function enable_all_tables {
    echo -e "${BLUE}=== 开始启用所有表 ===${NC}"
    
    cd "$SCRIPT_DIR"
    echo -e "${YELLOW}执行命令: node enable-all-tables.js${NC}"
    node enable-all-tables.js
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}所有表已成功启用！${NC}"
        echo -e "现在您可以运行以下命令生成所有表的文档:"
        echo -e "${YELLOW}$0 docs --schema $SCHEMA_NAME${NC}"
    else
        echo -e "${RED}启用所有表失败，请检查错误信息${NC}"
        exit 1
    fi
}

# 配置管理
function manage_config {
    echo -e "${BLUE}=== 配置管理 ===${NC}"
    
    if [ "$CONFIG_ACTION" = "list" ]; then
        # 列出所有表配置
        cd "$SCRIPT_DIR"
        echo -e "${YELLOW}执行命令: node generateTableConfig.js list${NC}"
        node generateTableConfig.js list
    
    elif [ "$CONFIG_ACTION" = "enable" ] && [ -n "$TARGET_TABLE" ]; then
        # 启用指定表
        cd "$SCRIPT_DIR"
        echo -e "${YELLOW}执行命令: node generateTableConfig.js enable \"$TARGET_TABLE\"${NC}"
        node generateTableConfig.js enable "$TARGET_TABLE"
    
    elif [ "$CONFIG_ACTION" = "disable" ] && [ -n "$TARGET_TABLE" ]; then
        # 禁用指定表
        cd "$SCRIPT_DIR"
        echo -e "${YELLOW}执行命令: node generateTableConfig.js disable \"$TARGET_TABLE\"${NC}"
        node generateTableConfig.js disable "$TARGET_TABLE"
    
    elif [ "$CONFIG_ACTION" = "edit" ] && [ -n "$TARGET_TABLE" ] && [ -n "$CONFIG_VALUE" ]; then
        # 自定义表配置
        cd "$SCRIPT_DIR"
        echo -e "${YELLOW}执行命令: node generateTableConfig.js update \"$TARGET_TABLE\" '$CONFIG_VALUE'${NC}"
        node generateTableConfig.js update "$TARGET_TABLE" "$CONFIG_VALUE"
    
    else
        echo -e "${RED}错误: 无效的config子命令或参数不足${NC}"
        echo "用法例子:"
        echo "  $0 config list              # 列出所有表配置"
        echo "  $0 config enable <表名>     # 启用指定表"
        echo "  $0 config disable <表名>    # 禁用指定表"
        echo "  $0 config edit <表名> <JSON> # 自定义配置"
        exit 1
    fi
}

# 导出为CSV
function export_csv {
    echo -e "${BLUE}=== 开始导出CSV数据 ===${NC}"
    
    if [ -z "$TARGET_TABLE" ]; then
        echo -e "${RED}错误: 导出CSV需要指定表名 (-t 或 --table 参数)${NC}"
        exit 1
    fi
    
    cd "$SCRIPT_DIR"
    echo -e "${YELLOW}执行命令: node generateTableDocs.js --export-csv --table $TARGET_TABLE --schema $SCHEMA_NAME${NC}"
    node generateTableDocs.js --export-csv --table "$TARGET_TABLE" --schema "$SCHEMA_NAME"
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}CSV数据导出成功！${NC}"
    else
        echo -e "${RED}CSV数据导出失败，请检查错误信息${NC}"
        exit 1
    fi
}

# 测试连接
function test_connection {
    echo -e "${BLUE}=== 开始测试API连接 ===${NC}"
    
    cd "$SCRIPT_DIR"
    args=""
    
    if [ "$ENABLE_API_LOGGING" = true ]; then
        args="$args --log-api"
    fi
    
    echo -e "${YELLOW}执行命令: node test-token.js $args${NC}"
    node test-token.js $args
    
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}API连接测试成功！${NC}"
        
        # 测试获取表列表
        if [ -n "$SCHEMA_NAME" ]; then
            echo -e "\n${BLUE}=== 测试获取表列表 ===${NC}"
            echo -e "${YELLOW}执行命令: node test-table-list.js --schema $SCHEMA_NAME $args${NC}"
            node test-table-list.js --schema "$SCHEMA_NAME" $args
            
            if [ $? -eq 0 ]; then
                echo -e "${GREEN}获取表列表测试成功！${NC}"
            else
                echo -e "${RED}获取表列表测试失败，请检查错误信息${NC}"
            fi
        fi
    else
        echo -e "${RED}API连接测试失败，请检查错误信息${NC}"
        exit 1
    fi
}

# 解析命令行参数
POSITIONAL=()
while [[ $# -gt 0 ]]; do
    key="$1"
    case $key in
        all|docs|enable-all|export|test|help)
            COMMAND="$1"
            shift
            ;;
        config)
            COMMAND="config"
            CONFIG_ACTION="$2"
            if [[ "$CONFIG_ACTION" == "enable" || "$CONFIG_ACTION" == "disable" ]]; then
                TARGET_TABLE="$3"
                shift 3
            elif [[ "$CONFIG_ACTION" == "edit" ]]; then
                TARGET_TABLE="$3"
                CONFIG_VALUE="$4"
                shift 4
            elif [[ "$CONFIG_ACTION" == "list" ]]; then
                shift 2
            else
                shift
            fi
            ;;
        -o|--offline)
            OFFLINE_MODE=true
            shift
            ;;
        -r|--refresh-token)
            REFRESH_TOKEN=true
            shift
            ;;
        -s|--skip-config)
            SKIP_CONFIG=true
            shift
            ;;
        -e|--export-csv)
            EXPORT_CSV=true
            shift
            ;;
        -t|--table)
            TARGET_TABLE="$2"
            shift 2
            ;;
        -h|--help)
            print_help
            exit 0
            ;;
        --schema)
            SCHEMA_NAME="$2"
            shift 2
            ;;
        --log-api)
            ENABLE_API_LOGGING=true
            shift
            ;;
        --clear-api-logs)
            CLEAR_API_LOGS=true
            shift
            ;;
        *)
            POSITIONAL+=("$1")
            shift
            ;;
    esac
done
set -- "${POSITIONAL[@]}"

# 清理日志
if [ "$CLEAR_API_LOGS" = true ]; then
    LOGS_DIR="$SCRIPT_DIR/logs"
    if [ -d "$LOGS_DIR" ]; then
        echo -e "${YELLOW}正在清理日志文件...${NC}"
        rm -f "$LOGS_DIR"/*.log
        echo -e "${GREEN}日志文件已清理${NC}"
    else
        echo -e "${YELLOW}日志目录不存在: $LOGS_DIR${NC}"
    fi
fi

# 执行命令
case $COMMAND in
    all)
        execute_all
        ;;
    docs)
        execute_docs
        ;;
    enable-all)
        enable_all_tables
        ;;
    config)
        manage_config
        ;;
    export)
        export_csv
        ;;
    test)
        test_connection
        ;;
    help|*)
        print_help
        ;;
esac

exit 0 